home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Tcl-Tk 8.0 / Pre-installed version / tcl8.0 / tests / safe.test < prev    next >
Encoding:
Text File  |  1997-08-15  |  12.9 KB  |  404 lines  |  [TEXT/ALFA]

  1. # safe.test --
  2. #
  3. # This file contains a collection of tests for safe Tcl, packages loading,
  4. # and using safe interpreters. Sourcing this file into tcl runs the tests
  5. # and generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1995-1996 Sun Microsystems, Inc.
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. #
  12. # SCCS: @(#) safe.test 1.31 97/08/14 00:55:56
  13.  
  14. if {[string compare test [info procs test]] == 1} then {source defs}
  15.  
  16. foreach i [interp slaves] {
  17.   interp delete $i
  18. }
  19.  
  20. # Force actual loading of the safe package 
  21. # because we use un exported (and thus un-autoindexed) APIs
  22. # in this test result arguments:
  23. catch {safe::interpConfigure}
  24.  
  25. proc equiv {x} {return $x}
  26.  
  27. test safe-1.1 {safe::interpConfigure syntax} {
  28.     list [catch {safe::interpConfigure} msg] $msg;
  29. } {1 {no value given for parameter "slave" (use -help for full usage) :
  30.     slave name () name of the slave}}
  31.  
  32. test safe-1.2 {safe::interpCreate syntax} {
  33.     list [catch {safe::interpCreate -help} msg] $msg;
  34. } {1 {Usage information:
  35.     Var/FlagName  Type     Value   Help
  36.     ------------  ----     -----   ----
  37.     ( -help                        gives this help )
  38.     ?slave?       name     ()      name of the slave (optional)
  39.     -accessPath   list     ()      access path for the slave
  40.     -noStatics    boolflag (false) prevent loading of statically linked pkgs
  41.     -nestedLoadOk boolflag (false) allow nested loading
  42.     -deleteHook   script   ()      delete hook}}
  43.  
  44. test safe-1.3 {safe::interpInit syntax} {
  45.     list [catch {safe::interpInit -noStatics} msg] $msg;
  46. } {1 {bad value "-noStatics" for parameter
  47.     slave name () name of the slave}}
  48.  
  49.  
  50. test safe-2.1 {creating interpreters, should have no aliases} {
  51.     interp aliases
  52. } ""
  53. test safe-2.2 {creating interpreters, should have no aliases} {
  54.     catch {safe::interpDelete a}
  55.     interp create a
  56.     set l [a aliases]
  57.     safe::interpDelete a
  58.     set l
  59. } ""
  60. test safe-2.3 {creating safe interpreters, should have no aliases} {
  61.     catch {safe::interpDelete a}
  62.     interp create a -safe
  63.     set l [a aliases]
  64.     interp delete a
  65.     set l
  66. } ""
  67.  
  68. test safe-3.1 {calling safe::interpInit is safe} {
  69.     catch {safe::interpDelete a}
  70.     interp create a -safe 
  71.     safe::interpInit a
  72.     catch {interp eval a exec ls} msg
  73.     safe::interpDelete a
  74.     set msg
  75. } {invalid command name "exec"}
  76. test safe-3.2 {calling safe::interpCreate on trusted interp} {
  77.     catch {safe::interpDelete a}
  78.     safe::interpCreate a
  79.     set l [lsort [a aliases]]
  80.     safe::interpDelete a
  81.     set l
  82. } {exit file load source}
  83. test safe-3.3 {calling safe::interpCreate on trusted interp} {
  84.     catch {safe::interpDelete a}
  85.     safe::interpCreate a
  86.     set x [interp eval a {source [file join $tcl_library init.tcl]}]
  87.     safe::interpDelete a
  88.     set x
  89. } ""
  90. test safe-3.4 {calling safe::interpCreate on trusted interp} {
  91.     catch {safe::interpDelete a}
  92.     safe::interpCreate a
  93.     catch {set x \
  94.         [interp eval a {source [file join $tcl_library init.tcl]}]} msg
  95.     safe::interpDelete a
  96.     list $x $msg
  97. } {{} {}}
  98.  
  99. test safe-4.1 {safe::interpDelete} {
  100.     catch {safe::interpDelete a}
  101.     interp create a
  102.     safe::interpDelete a
  103. } ""
  104. test safe-4.2 {safe::interpDelete, indirectly} {
  105.     catch {safe::interpDelete a}
  106.     interp create a
  107.     a alias exit safe::interpDelete a
  108.     a eval exit
  109. } ""
  110. test safe-4.3 {safe::interpDelete, state array (not a public api)} {
  111.     catch {safe::interpDelete a}
  112.     namespace eval safe {set [InterpStateName a](foo) 33}
  113.     # not an error anymore to call it if interp is already
  114.     # deleted, to make trhings smooth if it's called twice...
  115.     catch {safe::interpDelete a} m1
  116.     catch {namespace eval safe {set [InterpStateName a](foo)}} m2
  117.     list $m1 $m2
  118. } "{}\
  119.    {can't read \"[safe::InterpStateName a]\": no such variable}"
  120.  
  121.  
  122. test safe-4.4 {safe::interpDelete, state array, indirectly (not a public api)} {
  123.     catch {safe::interpDelete a}
  124.     safe::interpCreate a
  125.     namespace eval safe {set [InterpStateName a](foo) 33}
  126.     a eval exit
  127.     catch {namespace eval safe {set [InterpStateName a](foo)}} msg
  128. } 1
  129.  
  130. test safe-4.5 {safe::interpDelete} {
  131.     catch {safe::interpDelete a}
  132.     safe::interpCreate a
  133.     catch {safe::interpCreate a} msg
  134.     set msg
  135. } {interpreter named "a" already exists, cannot create}
  136. test safe-4.6 {safe::interpDelete, indirectly} {
  137.     catch {safe::interpDelete a}
  138.     safe::interpCreate a
  139.     a eval exit
  140. } ""
  141.  
  142. # The following test checks whether the definition of tcl_endOfWord can be
  143. # obtained from auto_loading.
  144.  
  145. test safe-5.1 {test auto-loading in safe interpreters} {
  146.     catch {safe::interpDelete a}
  147.     safe::interpCreate a
  148.     set r [catch {interp eval a {tcl_endOfWord "" 0}} msg]
  149.     safe::interpDelete a
  150.     list $r $msg
  151. } {0 -1}
  152.  
  153. # test safe interps 'information leak'
  154. proc SI {} {
  155.     global I
  156.     set I [interp create -safe];
  157. }
  158. proc DI {} {
  159.     global I;
  160.     interp delete $I;
  161. }
  162. test safe-6.1 {test safe interpreters knowledge of the world} {
  163.     SI; set r [lsort [$I eval {info globals}]]; DI; set r
  164. } {tcl_interactive tcl_patchLevel tcl_platform tcl_version}
  165. test safe-6.2 {test safe interpreters knowledge of the world} {
  166.     SI; set r [$I eval {info script}]; DI; set r
  167. } {}
  168. test safe-6.3 {test safe interpreters knowledge of the world} {
  169.     SI; set r [lsort [$I eval {array names tcl_platform}]]; DI; set r
  170. } {byteOrder platform}
  171.  
  172. # more test should be added to check that hostname, nameofexecutable,
  173. # aren't leaking infos, but they still do...
  174.  
  175. # high level general test
  176. test safe-7.1 {tests that everything works at high level} {
  177.     set i [safe::interpCreate];
  178.     # no error shall occur:
  179.     # (because the default access_path shall include 1st level sub dirs
  180.     #  so package require in a slave works like in the master)
  181.     set v [interp eval $i {package require http 1}]
  182.     # no error shall occur:
  183.     interp eval $i {http_config};
  184.     safe::interpDelete $i
  185.     set v
  186. } 1.0
  187.  
  188. test safe-7.2 {tests specific path and interpFind/AddToAccessPath} {
  189.     set i [safe::interpCreate -nostat -nested -accessPath [list [info library]]];
  190.     # should not add anything (p0)
  191.     set token1 [safe::interpAddToAccessPath $i [info library]]
  192.     # should add as p1
  193.     set token2 [safe::interpAddToAccessPath $i "/dummy/unixlike/test/path"];
  194.     # an error shall occur (http is not anymore in the secure 0-level
  195.     # provided deep path)
  196.     list $token1 $token2 \
  197.         [catch {interp eval $i {package require http 1}} msg] $msg \
  198.         [safe::interpConfigure $i]\
  199.         [safe::interpDelete $i]
  200. } "{\$p(:0:)} {\$p(:1:)} 1 {can't find package http 1} {-accessPath {$tcl_library /dummy/unixlike/test/path} -noStatics -nestedLoadOk -deleteHook {}} {}"
  201.  
  202.  
  203. # test source control on file name
  204. test safe-8.1 {safe source control on file} {
  205.     set i "a";
  206.     catch {safe::interpDelete $i}
  207.     safe::interpCreate $i;
  208.     list  [catch {$i eval {source}} msg] \
  209.         $msg \
  210.         [safe::interpDelete $i] ;
  211. } {1 {wrong # args: should be "source fileName"} {}}
  212.  
  213. # test source control on file name
  214. test safe-8.2 {safe source control on file} {
  215.     set i "a";
  216.     catch {safe::interpDelete $i}
  217.     safe::interpCreate $i;
  218.     list  [catch {$i eval {source}} msg] \
  219.         $msg \
  220.         [safe::interpDelete $i] ;
  221. } {1 {wrong # args: should be "source fileName"} {}}
  222.  
  223. test safe-8.3 {safe source control on file} {
  224.     set i "a";
  225.     catch {safe::interpDelete $i}
  226.     safe::interpCreate $i;
  227.     set log {};
  228.     proc safe-test-log {str} {global log; lappend log $str}
  229.     set prevlog [safe::setLogCmd];
  230.     safe::setLogCmd safe-test-log;
  231.     list  [catch {$i eval {source .}} msg] \
  232.         $msg \
  233.         $log \
  234.         [safe::setLogCmd $prevlog; unset log] \
  235.         [safe::interpDelete $i] ;
  236. } {1 {permission denied} {{ERROR for slave a : ".": is a directory}} {} {}}
  237.  
  238.  
  239. test safe-8.4 {safe source control on file} {
  240.     set i "a";
  241.     catch {safe::interpDelete $i}
  242.     safe::interpCreate $i;
  243.     set log {};
  244.     proc safe-test-log {str} {global log; lappend log $str}
  245.     set prevlog [safe::setLogCmd];
  246.     safe::setLogCmd safe-test-log;
  247.     list  [catch {$i eval {source /abc/def}} msg] \
  248.         $msg \
  249.         $log \
  250.         [safe::setLogCmd $prevlog; unset log] \
  251.         [safe::interpDelete $i] ;
  252. } {1 {permission denied} {{ERROR for slave a : "/abc/def": not in access_path}} {} {}}
  253.  
  254.  
  255. test safe-8.5 {safe source control on file} {
  256.     set i "a";
  257.     catch {safe::interpDelete $i}
  258.     safe::interpCreate $i;
  259.     set log {};
  260.     proc safe-test-log {str} {global log; lappend log $str}
  261.     set prevlog [safe::setLogCmd];
  262.     safe::setLogCmd safe-test-log;
  263.     list  [catch {$i eval {source [file join [info lib] blah]}} msg] \
  264.         $msg \
  265.         $log \
  266.         [safe::setLogCmd $prevlog; unset log] \
  267.         [safe::interpDelete $i] ;
  268. } "1 {blah: must be a *.tcl or tclIndex} {{ERROR for slave a : [file join [info library] blah]:blah: must be a *.tcl or tclIndex}} {} {}"
  269.  
  270.  
  271. test safe-8.6 {safe source control on file} {
  272.     set i "a";
  273.     catch {safe::interpDelete $i}
  274.     safe::interpCreate $i;
  275.     set log {};
  276.     proc safe-test-log {str} {global log; lappend log $str}
  277.     set prevlog [safe::setLogCmd];
  278.     safe::setLogCmd safe-test-log;
  279.     list  [catch {$i eval {source [file join [info lib] blah.tcl]}} msg] \
  280.         $msg \
  281.         $log \
  282.         [safe::setLogCmd $prevlog; unset log] \
  283.         [safe::interpDelete $i] ;
  284. } "1 {no such file or directory} {{ERROR for slave a : [file join [info library] blah.tcl]:no such file or directory}} {} {}"
  285.  
  286.  
  287. test safe-8.7 {safe source control on file} {
  288.     set i "a";
  289.     catch {safe::interpDelete $i}
  290.     safe::interpCreate $i;
  291.     set log {};
  292.     proc safe-test-log {str} {global log; lappend log $str}
  293.     set prevlog [safe::setLogCmd];
  294.     safe::setLogCmd safe-test-log;
  295.     list  [catch {$i eval {source [file join [info lib] xxxxxxxxxxx.tcl]}}\
  296.          msg] \
  297.         $msg \
  298.         $log \
  299.         [safe::setLogCmd $prevlog; unset log] \
  300.         [safe::interpDelete $i] ;
  301. } "1 {xxxxxxxxxxx.tcl: filename too long} {{ERROR for slave a : [file join [info library] xxxxxxxxxxx.tcl]:xxxxxxxxxxx.tcl: filename too long}} {} {}"
  302.  
  303. test safe-8.8 {safe source forbids -rsrc} {
  304.     set i "a";
  305.     catch {safe::interpDelete $i}
  306.     safe::interpCreate $i;
  307.     list  [catch {$i eval {source -rsrc Init}} msg] \
  308.         $msg \
  309.         [safe::interpDelete $i] ;
  310. } {1 {wrong # args: should be "source fileName"} {}}
  311.  
  312.  
  313. test safe-9.1 {safe interps' deleteHook} {
  314.     set i "a";
  315.     catch {safe::interpDelete $i}
  316.     set res {}
  317.     proc testDelHook {args} {
  318.     global res;
  319.     # the interp still exists at that point
  320.     interp eval a {set delete 1}
  321.     # mark that we've been here (successfully)
  322.     set res $args;
  323.     }
  324.     safe::interpCreate $i -deleteHook "testDelHook arg1 arg2";
  325.     list [interp eval $i exit] $res
  326. } {{} {arg1 arg2 a}}
  327.  
  328. test safe-9.2 {safe interps' error in deleteHook} {
  329.     set i "a";
  330.     catch {safe::interpDelete $i}
  331.     set res {}
  332.     proc testDelHook {args} {
  333.     global res;
  334.     # the interp still exists at that point
  335.     interp eval a {set delete 1}
  336.     # mark that we've been here (successfully)
  337.     set res $args;
  338.     # create an exception
  339.     error "being catched";
  340.     }
  341.     set log {};
  342.     proc safe-test-log {str} {global log; lappend log $str}
  343.     safe::interpCreate $i -deleteHook "testDelHook arg1 arg2";
  344.     set prevlog [safe::setLogCmd];
  345.     safe::setLogCmd safe-test-log;
  346.     list  [safe::interpDelete $i] $res \
  347.         $log \
  348.         [safe::setLogCmd $prevlog; unset log];
  349. } {{} {arg1 arg2 a} {{NOTICE for slave a : About to delete} {ERROR for slave a : Delete hook error (being catched)} {NOTICE for slave a : Deleted}} {}}
  350.  
  351.  
  352.  
  353. # features which still need test cases:
  354. # -nostatics and -nestedloadok which
  355. # are not easily tested from tclsh, can be
  356. # tested in wish though (safetk.test)
  357. # (we'd need a static package)
  358. # we have Tcltest !
  359.  
  360. if {[catch {package require Tcltest} msg]} {
  361.     puts "This application hasn't been compiled with Tcltest"
  362.     puts "skipping remining safe test that relies on it."
  363. } else {
  364.  
  365.     # we use the Tcltest package , which has no Safe_Init
  366.  
  367. test safe-10.1 {testing statics loading} {
  368.     set i [safe::interpCreate]
  369.     list \
  370.         [catch {interp eval $i {load {} Tcltest}} msg] \
  371.         $msg \
  372.             [safe::interpDelete $i];
  373. } {1 {can't use package in a safe interpreter: no Tcltest_SafeInit procedure} {}}
  374.  
  375. test safe-10.2 {testing statics loading / -nostatics} {
  376.     set i [safe::interpCreate -nostatics]
  377.     list \
  378.         [catch {interp eval $i {load {} Tcltest}} msg] \
  379.         $msg \
  380.             [safe::interpDelete $i];
  381. } {1 {permission denied (static package)} {}}
  382.  
  383.  
  384.  
  385. test safe-10.3 {testing nested statics loading / no nested by default} {
  386.     set i [safe::interpCreate]
  387.     list \
  388.         [catch {interp eval $i {interp create x; load {} Tcltest x}} msg] \
  389.         $msg \
  390.             [safe::interpDelete $i];
  391. } {1 {permission denied (nested load)} {}}
  392.  
  393.  
  394. test safe-10.4 {testing nested statics loading / -nestedloadok} {
  395.     set i [safe::interpCreate -nested]
  396.     list \
  397.         [catch {interp eval $i {interp create x; load {} Tcltest x}} msg] \
  398.         $msg \
  399.             [safe::interpDelete $i];
  400. } {1 {can't use package in a safe interpreter: no Tcltest_SafeInit procedure} {}}
  401.  
  402.  
  403. }
  404.